package com.suda.jpa.service.impl;

import com.suda.jpa.Dao.OneToMany.ClazzDao;
import com.suda.jpa.Dao.OneToMany.StudentDao;
import com.suda.jpa.Entity.OneToMany.Clazz;
import com.suda.jpa.Entity.OneToMany.Student;
import com.suda.jpa.service.ClazzService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;

@Service
public class ClazzServiceImpl implements ClazzService {

    @Autowired
    private ClazzDao clazzDao;

    @Autowired
    private StudentDao studentDao;

    //删除班级信息,级联删除学生信息
    @Override
    //给当前的方法添加了事务,则方法内部所有的操作都在同一个session当中完成,就不会出现no session异常
    //原来的session是在dao层方法执行完毕之后就关闭,加上事务以后,则要在service层方法执行完毕之后才关闭session
    //延长了session的生命周期
    @Transactional
    public void deleteClazzWithStudent() {
        List<Clazz> all = this.clazzDao.findAll();
        for(Clazz clazz : all){
            //获取所有的学生信息
            //如果用到了学生信息,则会再次调用查询方法,如果session已经关闭(fetch = FetchType.LAZY),则会报no session异常
            List<Student> studentList = clazz.getList();
            for(Student student : studentList){
                //删除学生信息
                this.studentDao.delete(student);
            }

            //断开主外键连接
            clazz.setList(null);
            this.clazzDao.deleteById(clazz.getCid());
        }

    }
}
